import java.util.Random;

public class Solution {
    public static void main(String[] args) {
        /**
         * 今天有点想出去走走，故打算去上班，但是又不确定究竟是上班还是在寝室学习，故交给程序解决
         * 最终答案：去上班*/
//        Random random = new Random();
//        int randValue = random.nextInt();
//        System.out.println(randValue);
//        if(randValue % 2 == 0) {
//            System.out.println("去上班");
//        } else {
//            System.out.println("继续学习");
//        }
        Solution s = new Solution();
        for(int e: s.missingTwo(new int[]{2,3})) {
            System.out.print(e + " ");
        }
    }

    public int[] missingTwo(int[] nums) {
        /**
         * 消失的两个数字*/
        // 1 异或1~n所有数字
        int len = nums.length;
        int n = len + 2;
        int tempVar = 0;
        for(int i = 1; i <= n; i ++) {
            tempVar ^= i;
        }
        // 2 将上述结果与nums数组异或，得到缺失两个数的异或值
        for(int e: nums) {
            tempVar ^= e;
        }

        // 3 找到异或值的差异处，以此为分组进行分组异或（1~N + nums数组，非缺失值出现两次，缺失值仅出现一次）
        int lowBit = tempVar & (-tempVar);
        int a = 0;
        int b = 0;
        for(int i = 1; i <= n; i++) {
            if((i&lowBit) == 0) {
                a ^= i;
            } else {
                b ^= i;
            }
        }
        for(int e: nums) {
            if((e&lowBit) == 0) {
                a ^= e;
            } else {
                b ^= e;
            }
        }

        // 4 返回值
        return new int[]{a, b};
    }

    
}
